import pygame,time,random,sys,os
from pygame.locals import *



class heroP:
	'''玩家飞机'''
	def __init__(self,screen_te):
		self.x=200
		self.y=400
		self.screen_te=screen_te;
		self.image=pygame.image.load("./images/me.png")
		self.bullet_list=[];#存放子弹的对象
		self.bool_val=False;#代表hero未被击杀

	def display(s):
		#绘制子弹
		for b in s.bullet_list:
			b.display()
			if b.move():
				s.bullet_list.remove(b)

		'''绘制玩家飞机'''
		s.screen_te.blit(s.image,(s.x,s.y))
		

	def move_left(self):
		self.x-=5;
		if self.x<0:
			self.x=0

	def right_move(self):
		self.x+=5;
		if self.x>=406:
			self.x=406
	def move_down(self):
		self.y+=5;
		if self.y>494:
			self.y=494
	def move_up(self):
		self.y-=5;
		if self.y<0:
			self.y=0
					
	def fire(self):
		self.bullet_list.append(Bullet(self.screen_te,self.x,self.y))
		
	def check(self,Ene_bullet_list):
		'''敌机子弹和玩家飞机碰撞检测'''
		for blt in Ene_bullet_list:
			if blt.x+5>self.x+6 and blt.x < self.x+100 and blt.y+20>self.y+20 and blt.y+20<self.y+36:
				return True

class Bullet:
	'''子弹类'''
	def __init__(self,scr,cx,cy):
		self.cx=cx+53;
		self.cy=cy;
		self.scr=scr;
		self.image=pygame.image.load("./images/pd.png")
	def display(s):
		'''绘制子弹'''
		s.scr.blit(s.image,(s.cx,s.cy))
	def move(self):
		self.cy-=10;
		if self.cy<-20:
			return True
		
class Enemy:
	'''敌机类'''
	def __init__(self,screen):
		self.screen=screen;
		self.x=random.choice(range(406));
		self.y=-47;
		self.ima=pygame.image.load("./images/e1.png")


	def display(self,):
		'''绘制敌机'''
		self.screen.blit(self.ima,(self.x,self.y));

	def move(self,hero):
		self.y+=5;
		if self.y>600:
			return True;
		# 子弹消失
		for i in hero.bullet_list:
			if i.cy>self.y+40 and i.cy<self.y+70 and i.cx>self.x and i.cx<self.x+104 :
				hero.bullet_list.remove(i)
				return True

class Boom:
	'''爆炸类'''
	def __init__(self,screen,boomx,boomy):
		self.screen=screen;
		self.boomx=boomx;
		self.boomy=boomy;
		self.timeNow=0;

	def display(self):
		'''显示爆炸效果'''

		#根据主函数的while 循环，添加一个计时，改变爆炸的图
		if self.timeNow%5==0:		
			self.image=pygame.image.load("./images/boom"+str(int(self.timeNow/5)+1)+".png")
			self.screen.blit(self.image,(self.boomx,self.boomy));
		self.timeNow+=1;
		
		if self.timeNow==20:
			return True

class Ene_bullet:
	'''敌机子弹类'''
	def __init__(self,screen,x,y):
		self.screen=screen;
		self.x=x+46
		self.y=y+70
		self.imag=pygame.image.load("./images/enemy_bullet.png")

	
	#跑的速度大于敌机的速度	
	def move(self):
		self.y+=10;
		if self.y>=568:
			return True

	def display(self):
		'''绘制敌机子弹'''
		self.screen.blit(self.imag,(self.x,self.y));

def key_control(hero_t):
	'''这是键盘控制函数 '''
	#执行退出操作
	for event in pygame.event.get():
		if event.type==QUIT:
			exit();
	#获取按键信息
	press_ketys=pygame.key.get_pressed()
	#做判断并执行对应的操作
	if press_ketys[K_LEFT]:
		hero_t.move_left()
	elif press_ketys[K_RIGHT]:
		hero_t.right_move()
	
	if press_ketys[K_SPACE]:
		hero_t.fire()
	#和左右分开写，就可以斜着跑，体验好
	if press_ketys[K_DOWN]:
		hero_t.move_down()
	elif press_ketys[K_UP]:
		hero_t.move_up()
	if press_ketys[K_q]:
		sys.exit()

def Button(screen):
	overimg=pygame.image.load("./images/over.png")
	screen.blit(overimg,(135+200,120+150))
	resetimg=pygame.image.load("./images/reset.png")
	screen.blit(resetimg,(135,120+150))
	#设置两个按钮的位置
	over_rect=pygame.Rect(335,270,335+54,270+35)
	reset_rect=pygame.Rect(135,270,135+51,270+35)
	for event in pygame.event.get():
		if event.type==MOUSEBUTTONDOWN:
			#获取鼠标所点的位置
			mouse_x,mouse_y=pygame.mouse.get_pos()
			#判断鼠标所在的位置在不在按钮里面
			if over_rect.collidepoint(mouse_x,mouse_y):
				sys.exit()
			if reset_rect.collidepoint(mouse_x,mouse_y):
				return 0;
	return 2 #加了返回2，主程序才可以的循环，否则动不了

def main():
	#创建游戏窗口
	screen=pygame.display.set_mode((512,568),0,0)

	#创建游戏背景
	background=pygame.image.load("./images/bg2.png")


	#创建玩家飞机
	hero=heroP(screen)
	m=-968;
	#放置敌机
	Enemy_list=[];
	#放置子弹的列表
	Ene_bullet_list=[];
	#放置爆炸的列表
	boom_list=[];
	#放置自己爆炸的列表
	boom_self=[];
	#此参数 0：未被击杀  1：被击杀显示爆炸画面 2：被击杀显示重置按钮
	beAttack=0;
	#创建分数
	score=0;

	while 1:
		if beAttack==0:
			'''飞机没有被击杀，正常运行主程序'''
			#绘制画面
			screen.blit(background,(0,m))
			m+=2;
			if m>=-200:
				m=-968;
			
			#绘制玩家飞机
			hero.display();

			#随机生成敌机
			if random.choice(range(20))==10:
			 	Enemy_list.append(Enemy(screen))
			
			#绘制敌机
			for i in Enemy_list:
				i.display();
				# xdata.append(i.x)
				if random.choice(range(20))==10:
					#随机生成子弹，并且给初值位置（敌机当前的位置）
					Ene_bullet_list.append(Ene_bullet(screen,i.x,i.y))
				try:
					if i.move(hero): 	
						Enemy_list.remove(i);
						#每移除一个敌机，就产生一个爆炸
						boom_list.append(Boom(screen,i.x,i.y))
						#并且加5分
						score+=5;
				except:
					pass;
			#绘制爆炸		
			for bo in boom_list:
				if bo.display():
					boom_list.remove(bo);
			#绘制成绩
			pygame.font.init()
			text=pygame.font.SysFont("C:/Windows/Fonts/Times New Roman/times.ttf",50)
			text_fmt=text.render("score:"+str(score),1,(255,255,255))
			screen.blit(text_fmt,(0,0))
			
			#绘制子弹。所有子弹全部向下移动
			for but in Ene_bullet_list:
					but.display();
					if but.move():
						Ene_bullet_list.remove(but)

			
			
			#玩家和敌机以及子弹的碰撞检测，被检测到了就停下循环
			if hero.check(Ene_bullet_list) or hero.check(Enemy_list):
				boom=Boom(screen,hero.x,hero.y)
				boom_self.append(boom)
				beAttack=1
				# break
		elif beAttack==1:		
			'''显示玩家飞机爆炸效果'''
			for bi in boom_self:
				if boom.display():
					imageOver=pygame.image.load("./images/gameover.png")
					screen.blit(imageOver,(125,120))
					beAttack=2
		elif beAttack==2:
			'''显示重新开始游戏或者退出'''
			beAttack=Button(screen)
			if beAttack==0:
				main()

		#键盘控制
		key_control(hero)	
		#更新显示
		pygame.display.update()

		#根据分数来调整游戏的速度
		if score>100:
			time.sleep(0.02)
			
			if score>150:
				time.sleep(0.01)
				
		elif score>50:
			time.sleep(0.03)
			
		else:
			time.sleep(0.04)
			

if(__name__=="__main__"):
	main();